
#include "stdafx.h"
#include "Keccak.h"

namespace Keccak
{
    void Keccak::TransformBlock(byte* a_data, int a_index)
    {
        ulong* data = (ulong*)(a_data + a_index);

        ulong Aba, Abe, Abi, Abo, Abu;
        ulong Aga, Age, Agi, Ago, Agu;
        ulong Aka, Ake, Aki, Ako, Aku;
        ulong Ama, Ame, Ami, Amo, Amu;
        ulong Asa, Ase, Asi, Aso, Asu;
        ulong Bba, Bbe, Bbi, Bbo, Bbu;
        ulong Bga, Bge, Bgi, Bgo, Bgu;
        ulong Bka, Bke, Bki, Bko, Bku;
        ulong Bma, Bme, Bmi, Bmo, Bmu;
        ulong Bsa, Bse, Bsi, Bso, Bsu;
        ulong Ca, Ce, Ci, Co, Cu;
        ulong Da, De, Di, Do, Du;
        ulong Eba, Ebe, Ebi, Ebo, Ebu;
        ulong Ega, Ege, Egi, Ego, Egu;
        ulong Eka, Eke, Eki, Eko, Eku;
        ulong Ema, Eme, Emi, Emo, Emu;
        ulong Esa, Ese, Esi, Eso, Esu;

        ulong c_0 = 0x0000000000000001;
        ulong c_1 = 0x0000000000008082;
        ulong c_2 = 0x800000000000808a;
        ulong c_3 = 0x8000000080008000;
        ulong c_4 = 0x000000000000808b;
        ulong c_5 = 0x0000000080000001;
        ulong c_6 = 0x8000000080008081;
        ulong c_7 = 0x8000000000008009;
        ulong c_8 = 0x000000000000008a;
        ulong c_9 = 0x0000000000000088;
        ulong c_10 = 0x0000000080008009;
        ulong c_11 = 0x000000008000000a;
        ulong c_12 = 0x000000008000808b;
        ulong c_13 = 0x800000000000008b;
        ulong c_14 = 0x8000000000008089;
        ulong c_15 = 0x8000000000008003;
        ulong c_16 = 0x8000000000008002;
        ulong c_17 = 0x8000000000000080;
        ulong c_18 = 0x000000000000800a;
        ulong c_19 = 0x800000008000000a;
        ulong c_20 = 0x8000000080008081;
        ulong c_21 = 0x8000000000008080;
        ulong c_22 = 0x0000000080000001;
        ulong c_23 = 0x8000000080008008;

        for (uint j = 0; j < BlockSize / 8; j++)
            m_state[j] ^= data[j];

        Aba = m_state[0];
        Abe = m_state[1];
        Abi = m_state[2];
        Abo = m_state[3];
        Abu = m_state[4];
        Aga = m_state[5];
        Age = m_state[6];
        Agi = m_state[7];
        Ago = m_state[8];
        Agu = m_state[9];
        Aka = m_state[10];
        Ake = m_state[11];
        Aki = m_state[12];
        Ako = m_state[13];
        Aku = m_state[14];
        Ama = m_state[15];
        Ame = m_state[16];
        Ami = m_state[17];
        Amo = m_state[18];
        Amu = m_state[19];
        Asa = m_state[20];
        Ase = m_state[21];
        Asi = m_state[22];
        Aso = m_state[23];
        Asu = m_state[24];

        Ca = Aba^Aga^Aka^Ama^Asa;
        Ce = Abe^Age^Ake^Ame^Ase;
        Ci = Abi^Agi^Aki^Ami^Asi;
        Co = Abo^Ago^Ako^Amo^Aso;
        Cu = Abu^Agu^Aku^Amu^Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_0;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_1;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_2;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_3;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_4;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_5;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_6;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_7;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_8;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_9;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_10;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_11;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_12;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_13;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_14;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_15;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_16;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_17;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_18;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_19;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_20;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_21;
        Ca = Aba;
        Abe = Bbe ^ (~Bbi | Bbo);
        Ce = Abe;
        Abi = Bbi ^ (Bbo & Bbu);
        Ci = Abi;
        Abo = Bbo ^ (Bbu | Bba);
        Co = Abo;
        Abu = Bbu ^ (Bba & Bbe);
        Cu = Abu;
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Ca ^= Aga;
        Age = Bge ^ (Bgi & Bgo);
        Ce ^= Age;
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Agi;
        Ago = Bgo ^ (Bgu | Bga);
        Co ^= Ago;
        Agu = Bgu ^ (Bga & Bge);
        Cu ^= Agu;
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ca ^= Aka;
        Ake = Bke ^ (Bki & Bko);
        Ce ^= Ake;
        Aki = Bki ^ (~Bko & Bku);
        Ci ^= Aki;
        Ako = (~Bko) ^ (Bku | Bka);
        Co ^= Ako;
        Aku = Bku ^ (Bka & Bke);
        Cu ^= Aku;
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ca ^= Ama;
        Ame = Bme ^ (Bmi | Bmo);
        Ce ^= Ame;
        Ami = Bmi ^ (~Bmo | Bmu);
        Ci ^= Ami;
        Amo = ~Bmo ^ (Bmu & Bma);
        Co ^= Amo;
        Amu = Bmu ^ (Bma | Bme);
        Cu ^= Amu;
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ca ^= Asa;
        Ase = ~Bse ^ (Bsi | Bso);
        Ce ^= Ase;
        Asi = Bsi ^ (Bso & Bsu);
        Ci ^= Asi;
        Aso = Bso ^ (Bsu | Bsa);
        Co ^= Aso;
        Asu = Bsu ^ (Bsa & Bse);
        Cu ^= Asu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Aba ^= Da;
        Bba = Aba;
        Age ^= De;
        Bbe = (Age << 44) ^ (Age >> (64 - 44));
        Aki ^= Di;
        Bbi = (Aki << 43) ^ (Aki >> (64 - 43));
        Amo ^= Do;
        Bbo = (Amo << 21) ^ (Amo >> (64 - 21));
        Asu ^= Du;
        Bbu = (Asu << 14) ^ (Asu >> (64 - 14));
        Eba = Bba ^ (Bbe | Bbi);
        Eba ^= c_22;
        Ca = Eba;
        Ebe = Bbe ^ (~Bbi | Bbo);
        Ce = Ebe;
        Ebi = Bbi ^ (Bbo & Bbu);
        Ci = Ebi;
        Ebo = Bbo ^ (Bbu | Bba);
        Co = Ebo;
        Ebu = Bbu ^ (Bba & Bbe);
        Cu = Ebu;
        Abo ^= Do;
        Bga = (Abo << 28) ^ (Abo >> (64 - 28));
        Agu ^= Du;
        Bge = (Agu << 20) ^ (Agu >> (64 - 20));
        Aka ^= Da;
        Bgi = (Aka << 3) ^ (Aka >> (64 - 3));
        Ame ^= De;
        Bgo = (Ame << 45) ^ (Ame >> (64 - 45));
        Asi ^= Di;
        Bgu = (Asi << 61) ^ (Asi >> (64 - 61));
        Ega = Bga ^ (Bge | Bgi);
        Ca ^= Ega;
        Ege = Bge ^ (Bgi & Bgo);
        Ce ^= Ege;
        Egi = Bgi ^ (Bgo | ~Bgu);
        Ci ^= Egi;
        Ego = Bgo ^ (Bgu | Bga);
        Co ^= Ego;
        Egu = Bgu ^ (Bga & Bge);
        Cu ^= Egu;
        Abe ^= De;
        Bka = (Abe << 1) ^ (Abe >> (64 - 1));
        Agi ^= Di;
        Bke = (Agi << 6) ^ (Agi >> (64 - 6));
        Ako ^= Do;
        Bki = (Ako << 25) ^ (Ako >> (64 - 25));
        Amu ^= Du;
        Bko = (Amu << 8) ^ (Amu >> (64 - 8));
        Asa ^= Da;
        Bku = (Asa << 18) ^ (Asa >> (64 - 18));
        Eka = Bka ^ (Bke | Bki);
        Ca ^= Eka;
        Eke = Bke ^ (Bki & Bko);
        Ce ^= Eke;
        Eki = Bki ^ (~Bko & Bku);
        Ci ^= Eki;
        Eko = (~Bko) ^ (Bku | Bka);
        Co ^= Eko;
        Eku = Bku ^ (Bka & Bke);
        Cu ^= Eku;
        Abu ^= Du;
        Bma = (Abu << 27) ^ (Abu >> (64 - 27));
        Aga ^= Da;
        Bme = (Aga << 36) ^ (Aga >> (64 - 36));
        Ake ^= De;
        Bmi = (Ake << 10) ^ (Ake >> (64 - 10));
        Ami ^= Di;
        Bmo = (Ami << 15) ^ (Ami >> (64 - 15));
        Aso ^= Do;
        Bmu = (Aso << 56) ^ (Aso >> (64 - 56));
        Ema = Bma ^ (Bme & Bmi);
        Ca ^= Ema;
        Eme = Bme ^ (Bmi | Bmo);
        Ce ^= Eme;
        Emi = Bmi ^ (~Bmo | Bmu);
        Ci ^= Emi;
        Emo = ~Bmo ^ (Bmu & Bma);
        Co ^= Emo;
        Emu = Bmu ^ (Bma | Bme);
        Cu ^= Emu;
        Abi ^= Di;
        Bsa = (Abi << 62) ^ (Abi >> (64 - 62));
        Ago ^= Do;
        Bse = (Ago << 55) ^ (Ago >> (64 - 55));
        Aku ^= Du;
        Bsi = (Aku << 39) ^ (Aku >> (64 - 39));
        Ama ^= Da;
        Bso = (Ama << 41) ^ (Ama >> (64 - 41));
        Ase ^= De;
        Bsu = (Ase << 2) ^ (Ase >> (64 - 2));
        Esa = Bsa ^ (~Bse & Bsi);
        Ca ^= Esa;
        Ese = ~Bse ^ (Bsi | Bso);
        Ce ^= Ese;
        Esi = Bsi ^ (Bso & Bsu);
        Ci ^= Esi;
        Eso = Bso ^ (Bsu | Bsa);
        Co ^= Eso;
        Esu = Bsu ^ (Bsa & Bse);
        Cu ^= Esu;
        Da = Cu ^ (Ce << 1) ^ (Ce >> (64 - 1));
        De = Ca ^ (Ci << 1) ^ (Ci >> (64 - 1));
        Di = Ce ^ (Co << 1) ^ (Co >> (64 - 1));
        Do = Ci ^ (Cu << 1) ^ (Cu >> (64 - 1));
        Du = Co ^ (Ca << 1) ^ (Ca >> (64 - 1));
        Eba ^= Da;
        Bba = Eba;
        Ege ^= De;
        Bbe = (Ege << 44) ^ (Ege >> (64 - 44));
        Eki ^= Di;
        Bbi = (Eki << 43) ^ (Eki >> (64 - 43));
        Emo ^= Do;
        Bbo = (Emo << 21) ^ (Emo >> (64 - 21));
        Esu ^= Du;
        Bbu = (Esu << 14) ^ (Esu >> (64 - 14));
        Aba = Bba ^ (Bbe | Bbi);
        Aba ^= c_23;
        Abe = Bbe ^ (~Bbi | Bbo);
        Abi = Bbi ^ (Bbo & Bbu);
        Abo = Bbo ^ (Bbu | Bba);
        Abu = Bbu ^ (Bba & Bbe);
        Ebo ^= Do;
        Bga = (Ebo << 28) ^ (Ebo >> (64 - 28));
        Egu ^= Du;
        Bge = (Egu << 20) ^ (Egu >> (64 - 20));
        Eka ^= Da;
        Bgi = (Eka << 3) ^ (Eka >> (64 - 3));
        Eme ^= De;
        Bgo = (Eme << 45) ^ (Eme >> (64 - 45));
        Esi ^= Di;
        Bgu = (Esi << 61) ^ (Esi >> (64 - 61));
        Aga = Bga ^ (Bge | Bgi);
        Age = Bge ^ (Bgi & Bgo);
        Agi = Bgi ^ (Bgo | ~Bgu);
        Ago = Bgo ^ (Bgu | Bga);
        Agu = Bgu ^ (Bga & Bge);
        Ebe ^= De;
        Bka = (Ebe << 1) ^ (Ebe >> (64 - 1));
        Egi ^= Di;
        Bke = (Egi << 6) ^ (Egi >> (64 - 6));
        Eko ^= Do;
        Bki = (Eko << 25) ^ (Eko >> (64 - 25));
        Emu ^= Du;
        Bko = (Emu << 8) ^ (Emu >> (64 - 8));
        Esa ^= Da;
        Bku = (Esa << 18) ^ (Esa >> (64 - 18));
        Aka = Bka ^ (Bke | Bki);
        Ake = Bke ^ (Bki & Bko);
        Aki = Bki ^ (~Bko & Bku);
        Ako = ~Bko ^ (Bku | Bka);
        Aku = Bku ^ (Bka & Bke);
        Ebu ^= Du;
        Bma = (Ebu << 27) ^ (Ebu >> (64 - 27));
        Ega ^= Da;
        Bme = (Ega << 36) ^ (Ega >> (64 - 36));
        Eke ^= De;
        Bmi = (Eke << 10) ^ (Eke >> (64 - 10));
        Emi ^= Di;
        Bmo = (Emi << 15) ^ (Emi >> (64 - 15));
        Eso ^= Do;
        Bmu = (Eso << 56) ^ (Eso >> (64 - 56));
        Ama = Bma ^ (Bme & Bmi);
        Ame = Bme ^ (Bmi | Bmo);
        Ami = Bmi ^ (~Bmo | Bmu);
        Amo = ~Bmo ^ (Bmu & Bma);
        Amu = Bmu ^ (Bma | Bme);
        Ebi ^= Di;
        Bsa = (Ebi << 62) ^ (Ebi >> (64 - 62));
        Ego ^= Do;
        Bse = (Ego << 55) ^ (Ego >> (64 - 55));
        Eku ^= Du;
        Bsi = (Eku << 39) ^ (Eku >> (64 - 39));
        Ema ^= Da;
        Bso = (Ema << 41) ^ (Ema >> (64 - 41));
        Ese ^= De;
        Bsu = (Ese << 2) ^ (Ese >> (64 - 2));
        Asa = Bsa ^ (~Bse & Bsi);
        Ase = ~Bse ^ (Bsi | Bso);
        Asi = Bsi ^ (Bso & Bsu);
        Aso = Bso ^ (Bsu | Bsa);
        Asu = Bsu ^ (Bsa & Bse);

        m_state[0] = Aba;
        m_state[1] = Abe;
        m_state[2] = Abi;
        m_state[3] = Abo;
        m_state[4] = Abu;
        m_state[5] = Aga;
        m_state[6] = Age;
        m_state[7] = Agi;
        m_state[8] = Ago;
        m_state[9] = Agu;
        m_state[10] = Aka;
        m_state[11] = Ake;
        m_state[12] = Aki;
        m_state[13] = Ako;
        m_state[14] = Aku;
        m_state[15] = Ama;
        m_state[16] = Ame;
        m_state[17] = Ami;
        m_state[18] = Amo;
        m_state[19] = Amu;
        m_state[20] = Asa;
        m_state[21] = Ase;
        m_state[22] = Asi;
        m_state[23] = Aso;
        m_state[24] = Asu;
    }

    void Keccak::Initialize()
    {
        memset(m_state, 0, 200);

        int negs[] = { 1, 2, 8, 12, 17, 20 };
        for (int i = 0; i < 6; i++)
            m_state[negs[i]] = 0xFFFFFFFFFFFFFFFF;

        memset(m_buffer, 0, 192);
        m_buffer_pos = 0;
    }

    void Keccak::TransformBytes(byte* a_data, int a_index, int a_length)
    {
        if (m_buffer_pos > 0)
        {
            int left = BlockSize - m_buffer_pos;
            if (left > a_length)
                left = a_length;

            memcpy(&m_buffer[m_buffer_pos], &a_data[a_index], left);
            m_buffer_pos += left;
            a_index += left;
            a_length -= left;

            if (m_buffer_pos == BlockSize)
            {
                TransformBlock(m_buffer, 0);
                m_buffer_pos = 0;
            }
        }

        while (a_length >= (int)BlockSize)
        {
            TransformBlock(a_data, a_index);

            a_index += BlockSize;
            a_length -= BlockSize;
        }

        if (a_length > 0)
        {
            memcpy(&m_buffer[m_buffer_pos], &a_data[a_index], a_length);
            m_buffer_pos += a_length;
        }
    }

    byte* Keccak::GetResult()
    {
        byte* result = new byte[HashSize];
        memcpy(result, m_state, HashSize);
        return result;
    }

    void Keccak::Finish()
    {
        memset(m_buffer + m_buffer_pos, 0, BlockSize - m_buffer_pos);
        m_buffer[m_buffer_pos] = 1;

        m_buffer[BlockSize - 1] |= 128;

        TransformBlock(m_buffer, 0);
        m_buffer_pos = 0;

        m_state[1] = ~m_state[1];
        m_state[2] = ~m_state[2];
        m_state[8] = ~m_state[8];
        m_state[12] = ~m_state[12]; 
        m_state[17] = ~m_state[17];
    }

    byte* Keccak::TransformFinal()
    {
        Finish();
        byte* result = GetResult();
        Initialize();
        return result;
    }

    byte* Keccak::ComputeBytes(byte* a_data, int a_length)
    {
        Initialize();
        TransformBytes(a_data, 0, a_length);
        return TransformFinal();
    }
}